package demo1;

public class Test {
    public static void main(String[] args) {
        //向下转型
        Animal animal = new Dog("旺财",10);
        if(animal instanceof Dog) {
            //Dog dog=animal;//类型不同，换句话理解:(狗是动物，但动物不一定是狗),所以需要强制转换
            Dog dog = (Dog) animal;//但强制转换是一种并非安全的操作，此时可看到有一条警告，但可以使用
            dog.eat();
            System.out.println("Animal引用的是Dog这个对象");
        }else{
            System.out.println("Animal引用的不是Dog对象");
        }
        if(animal instanceof Bird){
            Bird bird = (Bird) animal;
            bird.faly();//此刻是直接为不安全的强制转换，因为上面new的对象是Dog,这里又是Bird，所以运行的时候会报错
            System.out.println("Animal应用的是Bird对象");
        }
        else{
            System.out.println("Animal引用的不是Bird对象");
        }
    }



    public static void func(Animal animal){
        animal.eat();
    }
    //返回值向上转型
    public static Animal func1(int a){
        if(a==1){
            return new Dog("大黄",19);
        }else{
            return new Bird("白影",10);
        }
    }
    public static void main2(String[] args) {//新地向上转型方式
        Dog dog = new Dog("旺财",10);
        Bird bird = new Bird("啾啾",6);
        func(dog);
        func(bird);
    }



    public static void main1(String[] args) {
//        Dog dog= new Dog("旺财",7);
//        Animal animal1=dog;//向上转型
        //dog.eat();//优先子类
        Animal animal=new Dog("旺财",7);//向上转型,等于上方两行
        animal.eat();//因为是向上转型，所以此时调用的是Animal,向上转了就是输出子类的
        //animal.bark();//这里为什么不行呢，因为对象始终是Animal,并非dog,没有重写的话Animal中不能调用bark(说白了Animal里面没有bark方法)


    }
}
